package com.study.java._01generic;

/**
 * <pre>
 *     author : slx
 *     time   : 2020/11/20
 *     desc   : 类型的继承关系
 * </pre>
 */
public class _05Demo {
    public static void main(String[] args) {

    }

    public void testExtends() {
        Plant<Apple> applePlant = new Plant<>();
        applePlant.setT(new Apple());
        // 此处将 Plant<Apple>强转为 Plant<Fruit> 编译失败
        // 就算Apple和Fruit有关系，Plant<Apple>和Plant<Fruit>也没有关系，他们的共同父类是Object
        // Plant<Fruit> fruitPlant = (Plant<Apple>) applePlant;
        // 通过限定符可以将不同泛型关联，Plant<? extends Fruit>是一切Plant<Fruit以及其子类>的基类
        Plant<? extends Fruit> fruitPlant = (Plant<Apple>) applePlant;
        // 使用限定后，无法存，取数据也需要强转了
        // fruitPlant.setT(new Apple());
        // Apple t = (Apple) fruitPlant.getT();

    }

    class Fruit {
    }

    class Apple extends Fruit {
    }

    class Plant<T> {
        private T t;

        public T getT() {
            return t;
        }

        public void setT(T t) {
            this.t = t;
        }
    }
}
